﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

#Область УстаревшиеПроцедурыИФункции

// Устарела. Следует использовать новую (см. ОбменДаннымиСервер.ЭтоАвтономноеРабочееМесто).
//
Функция ЭтоАвтономноеРабочееМесто() Экспорт
	
	Возврат РежимАвтономногоРабочегоМеста();
	
КонецФункции

// Устарела. Следует использовать новую (см. ОбменДаннымиСервер.УзелПланаОбменаПоКоду).
//
Функция НайтиУзелПланаОбменаПоКоду(ИмяПланаОбмена, КодУзла) Экспорт
	
	ШаблонТекста = "ПланОбмена.%1";
	ИмяПланаОбменаСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ИмяПланаОбмена);
	
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	ПланОбмена.Ссылка КАК Ссылка
	|ИЗ
	|	&ИмяПланаОбмена КАК ПланОбмена
	|ГДЕ
	|	ПланОбмена.Код = &Код";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой);
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Код", КодУзла);
	Запрос.Текст = ТекстЗапроса;
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если РезультатЗапроса.Пустой() Тогда
		
		Возврат Неопределено;
		
	КонецЕсли;
	
	Выборка = РезультатЗапроса.Выбрать();
	Выборка.Следующий();
	
	Возврат Выборка.Ссылка;
КонецФункции

#КонецОбласти

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// См. ОбменДаннымиСервер.ЭтоАвтономноеРабочееМесто.
Функция РежимАвтономногоРабочегоМеста() Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Если Константы.НастройкаПодчиненногоУзлаРИБЗавершена.Получить() Тогда
		
		Возврат Константы.ЭтоАвтономноеРабочееМесто.Получить();
		
	Иначе
		
		ГлавныйУзелЭтойИнформационнойБазы = ОбменДаннымиСервер.ГлавныйУзел();
		Возврат ГлавныйУзелЭтойИнформационнойБазы <> Неопределено
			И ЭтоУзелАвтономногоРабочегоМеста(ГлавныйУзелЭтойИнформационнойБазы);
		
	КонецЕсли;
	
КонецФункции

// Возвращает признак использования плана обмена в обмене данными.
// Если план обмена содержит хотя бы один узел кроме предопределенного,
// то считается, что он используется.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе.
//  Отправитель - ПланОбменаСсылка - значение параметра устанавливается, если необходимо
//   определить есть ли другие узлы обмена, кроме того, из
//   которого был получен объект.
//
// Возвращаемое значение:
//  Булево -  Истина - план обмена используется, Ложь - нет.
//
Функция ОбменДаннымиВключен(Знач ИмяПланаОбмена, Знач Отправитель = Неопределено) Экспорт
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда
		
		Возврат Ложь;
		
	КонецЕсли;
	
	ТекстЗапроса = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ИСТИНА
	|ИЗ
	|	&ИмяТаблицыМетаданных КАК ПланОбмена
	|ГДЕ
	|	НЕ ПланОбмена.ПометкаУдаления
	|	И НЕ ПланОбмена.ЭтотУзел
	|	И ПланОбмена.Ссылка <> &Отправитель";
	
	СтрокаЗамены = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ПланОбмена.%1", ИмяПланаОбмена);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", СтрокаЗамены);
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("Отправитель", Отправитель);
	Возврат Не Запрос.Выполнить().Пустой();
	
КонецФункции

// См. ОбменДаннымиСервер.ЭтоУзелАвтономногоРабочегоМеста.
Функция ЭтоУзелАвтономногоРабочегоМеста(Знач УзелИнформационнойБазы) Экспорт
	
	Возврат ОбменДаннымиПовтИсп.АвтономнаяРаботаПоддерживается()
		И ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы) = ОбменДаннымиПовтИсп.ПланОбменаАвтономнойРаботы();
	
КонецФункции

// См. ОбменДаннымиСервер.НастройкиПланаОбмена
Функция НастройкиПланаОбмена(ИмяПланаОбмена, ВерсияКорреспондента = "", ИмяКорреспондента = "", КорреспондентВМоделиСервиса = Неопределено) Экспорт
	Возврат ОбменДаннымиСервер.НастройкиПланаОбмена(ИмяПланаОбмена, ВерсияКорреспондента, ИмяКорреспондента, КорреспондентВМоделиСервиса);
КонецФункции

// См. ОбменДаннымиСервер.ОписаниеВариантаНастройки
Функция ОписаниеВариантаНастройки(ИмяПланаОбмена, ИдентификаторНастройки, 
								ВерсияКорреспондента = "", ИмяКорреспондента = "") Экспорт
	Возврат ОбменДаннымиСервер.ОписаниеВариантаНастройки(ИмяПланаОбмена, ИдентификаторНастройки, 
								ВерсияКорреспондента, ИмяКорреспондента);
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Механизм регистрации объектов на узлах планов обмена (МРО).

// Получает имя этой информационной базы из константы или из синонима конфигурации.
// (Только для внутреннего использования).
//
Функция ИмяЭтойИнформационнойБазы() Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Результат = Константы.ЗаголовокСистемы.Получить();
	
	Если ПустаяСтрока(Результат) Тогда
		
		Результат = Метаданные.Синоним;
		
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

// Получает код предопределенного узла плана обмена.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе.
// 
// Возвращаемое значение:
//  Строка - код предопределенного узла плана обмена.
//
Функция ПолучитьКодЭтогоУзлаДляПланаОбмена(ИмяПланаОбмена) Экспорт
	
	Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена), "Код");
	
КонецФункции

// Получает наименование предопределенного узла плана обмена.
//
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена.
// 
// Возвращаемое значение:
//  Строка - наименование предопределенного узла плана обмена.
//
Функция НаименованиеЭтогоУзла(Знач УзелИнформационнойБазы) Экспорт
	
	Возврат Строка(ПолучитьЭтотУзелПланаОбмена(ПолучитьИмяПланаОбмена(УзелИнформационнойБазы)));
	
КонецФункции

// Получает массив имен планов обмена конфигурации, которые используют функционал БСП.
//
// Параметры:
//  Нет.
// 
// Возвращаемое значение:
//   Массив - массив элементов имен планов обмена.
//
Функция ПланыОбменаБСП() Экспорт
	
	Возврат СписокПлановОбменаБСП().ВыгрузитьЗначения();
	
КонецФункции

// Определяет, используется ли план обмена, идентифицируемый именем, в модели сервиса.
// Чтобы дать возможность это определить, все планы обмена на уровне модуля менеджера
// определяют функцию ПланОбменаИспользуетсяВМоделиСервиса(),
// явно возвращающую значение Истина или Ложь.
//
// Параметры:
//   ИмяПланаОбмена - Строка.
//
// Возвращаемое значение:
//   Булево
//
Функция ПланОбменаИспользуетсяВМоделиСервиса(Знач ИмяПланаОбмена) Экспорт
	
	Результат = Ложь;
	
	Если ПланыОбменаБСП().Найти(ИмяПланаОбмена) <> Неопределено Тогда
		Результат = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена,
			"ПланОбменаИспользуетсяВМоделиСервиса", "");
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Заполняет перечень кодов возможных ошибок.
//
// Возвращаемое значение:
//  Соответствие из КлючИЗначение:
//    * Ключ - Число - код ошибки
//    * Значение - Строка - описание ошибки
//
Функция СообщенияОбОшибках() Экспорт
	
	СообщенияОбОшибках = Новый Соответствие;
		
	СообщенияОбОшибках.Вставить(2,  НСтр("ru = 'Ошибка распаковки файла обмена. Файл заблокирован.'"));
	СообщенияОбОшибках.Вставить(3,  НСтр("ru = 'Указанный файл правил обмена не существует.'"));
	СообщенияОбОшибках.Вставить(4,  НСтр("ru = 'Ошибка при создании COM-объекта Msxml2.DOMDocument'"));
	СообщенияОбОшибках.Вставить(5,  НСтр("ru = 'Ошибка открытия файла обмена'"));
	СообщенияОбОшибках.Вставить(6,  НСтр("ru = 'Ошибка при загрузке правил обмена'"));
	СообщенияОбОшибках.Вставить(7,  НСтр("ru = 'Ошибка формата правил обмена'"));
	СообщенияОбОшибках.Вставить(8,  НСтр("ru = 'Некорректно указано имя файла для выгрузки данных'"));
	СообщенияОбОшибках.Вставить(9,  НСтр("ru = 'Ошибка формата файла обмена'"));
	СообщенияОбОшибках.Вставить(10, НСтр("ru = 'Не указано имя файла для выгрузки данных (Имя файла данных)'"));
	СообщенияОбОшибках.Вставить(11, НСтр("ru = 'Ссылка на несуществующий объект метаданных в правилах обмена'"));
	СообщенияОбОшибках.Вставить(12, НСтр("ru = 'Не указано имя файла с правилами обмена (Имя файла правил)'"));
			
	СообщенияОбОшибках.Вставить(13, НСтр("ru = 'Ошибка получения значения свойства объекта (по имени свойства источника)'"));
	СообщенияОбОшибках.Вставить(14, НСтр("ru = 'Ошибка получения значения свойства объекта (по имени свойства приемника)'"));
	
	СообщенияОбОшибках.Вставить(15, НСтр("ru = 'Не указано имя файла для загрузки данных (Имя файла для загрузки)'"));
			
	СообщенияОбОшибках.Вставить(16, НСтр("ru = 'Ошибка получения значения свойства подчиненного объекта (по имени свойства источника)'"));
	СообщенияОбОшибках.Вставить(17, НСтр("ru = 'Ошибка получения значения свойства подчиненного объекта (по имени свойства приемника)'"));
	СообщенияОбОшибках.Вставить(18, НСтр("ru = 'Ошибка при создании обработки с кодом обработчиков'"));
	СообщенияОбОшибках.Вставить(19, НСтр("ru = 'Ошибка в обработчике события ПередЗагрузкойОбъекта'"));
	СообщенияОбОшибках.Вставить(20, НСтр("ru = 'Ошибка в обработчике события ПриЗагрузкеОбъекта'"));
	СообщенияОбОшибках.Вставить(21, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиОбъекта'"));
	СообщенияОбОшибках.Вставить(22, НСтр("ru = 'Ошибка в обработчике события ПередЗагрузкойДанных (конвертация)'"));
	СообщенияОбОшибках.Вставить(23, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиДанных (конвертация)'"));
	СообщенияОбОшибках.Вставить(24, НСтр("ru = 'Ошибка при удалении объекта'"));
	СообщенияОбОшибках.Вставить(25, НСтр("ru = 'Ошибка при записи документа'"));
	СообщенияОбОшибках.Вставить(26, НСтр("ru = 'Ошибка записи объекта'"));
	СообщенияОбОшибках.Вставить(27, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойПравилаОчистки'"));
	СообщенияОбОшибках.Вставить(28, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиПравилаОчистки'"));
	СообщенияОбОшибках.Вставить(29, НСтр("ru = 'Ошибка в обработчике события ПередУдалениемОбъекта'"));
	
	СообщенияОбОшибках.Вставить(31, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойПравилаВыгрузки'"));
	СообщенияОбОшибках.Вставить(32, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиПравилаВыгрузки'"));
	СообщенияОбОшибках.Вставить(33, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойОбъекта'"));
	СообщенияОбОшибках.Вставить(34, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъекта'"));
			
	СообщенияОбОшибках.Вставить(41, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойОбъекта'"));
	СообщенияОбОшибках.Вставить(42, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузкеОбъекта'"));
	СообщенияОбОшибках.Вставить(43, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъекта'"));
			
	СообщенияОбОшибках.Вставить(45, НСтр("ru = 'Не найдено правило конвертации объектов'"));
		
	СообщенияОбОшибках.Вставить(48, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойВыгрузки группы свойств'"));
	СообщенияОбОшибках.Вставить(49, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиВыгрузки группы свойств'"));
	СообщенияОбОшибках.Вставить(50, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкой (объекта коллекции)'"));
	СообщенияОбОшибках.Вставить(51, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузке (объекта коллекции)'"));
	СообщенияОбОшибках.Вставить(52, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузки (объекта коллекции)'"));
	СообщенияОбОшибках.Вставить(53, НСтр("ru = 'Ошибка в глобальном обработчике события ПередЗагрузкойОбъекта (конвертация)'"));
	СообщенияОбОшибках.Вставить(54, НСтр("ru = 'Ошибка в глобальном обработчике события ПослеЗагрузкиОбъекта (конвертация)'"));
	СообщенияОбОшибках.Вставить(55, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкой (свойства)'"));
	СообщенияОбОшибках.Вставить(56, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузке (свойства)'"));
	СообщенияОбОшибках.Вставить(57, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузки (свойства)'"));
	
	СообщенияОбОшибках.Вставить(62, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойДанных (конвертация)'"));
	СообщенияОбОшибках.Вставить(63, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)'"));
	СообщенияОбОшибках.Вставить(64, НСтр("ru = 'Ошибка в глобальном обработчике события ПередКонвертациейОбъекта (конвертация)'"));
	СообщенияОбОшибках.Вставить(65, НСтр("ru = 'Ошибка в глобальном обработчике события ПередВыгрузкойОбъекта (конвертация)'"));
	СообщенияОбОшибках.Вставить(66, НСтр("ru = 'Ошибка получения коллекции подчиненных объектов из входящих данных'"));
	СообщенияОбОшибках.Вставить(67, НСтр("ru = 'Ошибка получения свойства подчиненного объекта из входящих данных'"));
	СообщенияОбОшибках.Вставить(68, НСтр("ru = 'Ошибка получения свойства объекта из входящих данных'"));
	
	СообщенияОбОшибках.Вставить(69, НСтр("ru = 'Ошибка в глобальном обработчике события ПослеВыгрузкиОбъекта (конвертация)'"));
	
	СообщенияОбОшибках.Вставить(71, НСтр("ru = 'Не найдено соответствие для значения Источника'"));
	
	СообщенияОбОшибках.Вставить(72, НСтр("ru = 'Ошибка при выгрузке данных для узла плана обмена'"));
	
	СообщенияОбОшибках.Вставить(73, НСтр("ru = 'Ошибка в обработчике события ПоследовательностьПолейПоиска'"));
	СообщенияОбОшибках.Вставить(74, НСтр("ru = 'Перезагрузите правила обмена для выгрузки данных.'"));
	
	СообщенияОбОшибках.Вставить(75, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиПравилОбмена (конвертация)'"));
	СообщенияОбОшибках.Вставить(76, НСтр("ru = 'Ошибка в обработчике события ПередОтправкойИнформацииОбУдалении (конвертация)'"));
	СообщенияОбОшибках.Вставить(77, НСтр("ru = 'Ошибка в обработчике события ПриПолученииИнформацииОбУдалении (конвертация)'"));
	
	СообщенияОбОшибках.Вставить(78, НСтр("ru = 'Ошибка при выполнении алгоритма после загрузки значений параметров'"));
	
	СообщенияОбОшибках.Вставить(79, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъектаВФайл'"));
	
	СообщенияОбОшибках.Вставить(80, НСтр("ru = 'Ошибка установки свойства предопределенного элемента.
		|Нельзя помечать на удаление предопределенный элемент. Пометка на удаление для объекта не установлена.'"));
	//
	СообщенияОбОшибках.Вставить(81, НСтр("ru = 'Возникла коллизия изменений объектов.
		|Объект этой информационной базы был заменен версией объекта из второй информационной базы.'"));
	//
	СообщенияОбОшибках.Вставить(82, НСтр("ru = 'Возникла коллизия изменений объектов.
		|Объект из второй информационной базы не принят. Объект этой информационной базы не изменен.'"));
	//
	СообщенияОбОшибках.Вставить(83, НСтр("ru = 'Ошибка обращения к табличной части объекта. Табличная часть объекта не может быть изменена.'"));
	СообщенияОбОшибках.Вставить(84, НСтр("ru = 'Коллизия дат запрета изменения.'"));
	
	СообщенияОбОшибках.Вставить(174, НСтр("ru = 'Сообщение обмена было принято ранее'"));
	СообщенияОбОшибках.Вставить(175, НСтр("ru = 'Ошибка в обработчике события ПередПолучениемИзмененныхОбъектов (конвертация)'"));
	СообщенияОбОшибках.Вставить(176, НСтр("ru = 'Ошибка в обработчике события ПослеПолученияИнформацииОбУзлахОбмена (конвертация)'"));
		
	СообщенияОбОшибках.Вставить(177, НСтр("ru = 'Имя плана обмена из сообщения обмена не соответствует ожидаемому.'"));
	СообщенияОбОшибках.Вставить(178, НСтр("ru = 'Получатель из сообщения обмена не соответствует ожидаемому.'"));
	
	СообщенияОбОшибках.Вставить(1000, НСтр("ru = 'Ошибка при создании временного файла выгрузки данных'"));
	
	Возврат СообщенияОбОшибках;
	
КонецФункции

Функция АвтономнаяРаботаПоддерживается() Экспорт
	
	Возврат ПланыОбменаАвтономнойРаботы().Количество() = 1;
	
КонецФункции

Функция НазначениеПланаОбмена(ИмяПланаОбмена) Экспорт
	
	Возврат ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "НазначениеПланаОбмена");
	
КонецФункции

// Определяет наличие макета у плана обмена.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе.
//  ИмяМакета - Строка - имя макета, наличие которого следует определить.
//
//  Возвращаемое значение:
//    Булево - Истина - план обмена содержит заданный макет, иначе Ложь.
//
Функция ЕстьМакетПланаОбмена(Знач ИмяПланаОбмена, Знач ИмяМакета) Экспорт
	
	Возврат Метаданные.ПланыОбмена[ИмяПланаОбмена].Макеты.Найти(ИмяМакета) <> Неопределено;
	
КонецФункции

// Возвращает признак принадлежности плана обмена к плану обмена РИБ.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе.
//
//  Возвращаемое значение:
//    Булево - Истина - план обмена принадлежит плану обмена РИБ, иначе Ложь.
//
Функция ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена) Экспорт
	
	Возврат Метаданные.ПланыОбмена[ИмяПланаОбмена].РаспределеннаяИнформационнаяБаза;
	
КонецФункции

Функция ПланОбменаАвтономнойРаботы() Экспорт
	
	Результат = ПланыОбменаАвтономнойРаботы();
	
	Если Результат.Количество() = 0 Тогда
		
		ВызватьИсключение НСтр("ru = 'Автономная работа в системе не предусмотрена.'");
		
	ИначеЕсли Результат.Количество() > 1 Тогда
		
		ВызватьИсключение НСтр("ru = 'Создано более одного плана обмена для автономной работы.'");
		
	КонецЕсли;
	
	Возврат Результат[0];
КонецФункции

// См. ОбменДаннымиСервер.ЭтоПланОбменаXDTO
Функция ЭтоПланОбменаXDTO(ПланОбмена) Экспорт
	Если ТипЗнч(ПланОбмена) = Тип("Строка") Тогда
		ИмяПланаОбмена = ПланОбмена;
	Иначе
		ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(ПланОбмена);
	КонецЕсли;
	Возврат ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ЭтоПланОбменаXDTO");
КонецФункции

Функция ЭтоСтроковыйРеквизитНеограниченнойДлины(ПолноеИмя, ИмяРеквизита) Экспорт
	
	ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);
	Реквизит = ОбъектМетаданных.Реквизиты.Найти(ИмяРеквизита);
	
	Если Реквизит <> Неопределено
		И Реквизит.Тип.СодержитТип(Тип("Строка"))
		И (Реквизит.Тип.КвалификаторыСтроки.Длина = 0) Тогда
		Возврат Истина;
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции

// Получает имя плана обмена как объекта метаданного для заданного узла.
//
// Параметры:
//  УзелПланаОбмена - ПланОбменаСсылка - узел плана обмена.
// 
// Возвращаемое значение:
//  Имя - Строка - имя плана обмена как объекта метаданного.
//
Функция ПолучитьИмяПланаОбмена(УзелПланаОбмена) Экспорт
	
	Возврат УзелПланаОбмена.Метаданные().Имя;
	
КонецФункции

Функция ПолучитьИмяПланаОбменаКорреспондента(УзелПланаОбмена) Экспорт
	
	ИмяПланаОбмена = ПолучитьИмяПланаОбмена(УзелПланаОбмена);
	
	Если Не ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(УзелПланаОбмена) Тогда
		Возврат ИмяПланаОбмена;
	КонецЕсли;
	
	ИмяПланаОбменаКорреспондента = РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.ИмяПланаОбменаКорреспондента(УзелПланаОбмена);
	
	Если ИмяПланаОбменаКорреспондента = "" Тогда
		ИмяПланаОбменаКорреспондента = ИмяПланаОбмена;
	КонецЕсли; 
	
	Возврат ИмяПланаОбменаКорреспондента;
	
КонецФункции

// Получает массив имен разделенных планов обмена конфигурации, которые используют функционал БСП.
// Если конфигурация не содержит разделителей, то все планы обмена считаются разделенными (прикладными).
//
// Параметры:
//  Нет.
// 
// Возвращаемое значение:
//   Массив - массив элементов имен разделенных планов обмена.
//
Функция РазделенныеПланыОбменаБСП() Экспорт
	
	Результат = Новый Массив;
	
	Для Каждого ИмяПланаОбмена Из ПланыОбменаБСП() Цикл
		
		Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
			МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
			ЭтоРазделеннаяКонфигурация = МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация();
		Иначе
			ЭтоРазделеннаяКонфигурация = Ложь;
		КонецЕсли;
		
		Если ЭтоРазделеннаяКонфигурация Тогда
			
			Если МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных("ПланОбмена." + ИмяПланаОбмена,
					МодульРаботаВМоделиСервиса.РазделительОсновныхДанных()) Тогда
				
				Результат.Добавить(ИмяПланаОбмена);
				
			КонецЕсли;
			
		Иначе
			
			Результат.Добавить(ИмяПланаОбмена);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

// Определяет используется ли версионирование.
//
// Параметры:
//  Отправитель - ПланОбменаСсылка - если параметр передается, то определяет необходимо
//		ли использовать создание версий объектов для переданного узла.
//
Функция ИспользуетсяВерсионирование(Отправитель = Неопределено, ПроверятьПраваДоступа = Ложь) Экспорт
	
	Используется = Ложь;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда
		
		Используется = ?(Отправитель <> Неопределено, ЭтоУзелОбменаДаннымиБСП(Отправитель), Истина);
		
		Если Используется И ПроверятьПраваДоступа Тогда
			
			МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов");
			Используется = МодульВерсионированиеОбъектов.ЕстьПравоЧтенияИнформацииОВерсияхОбъектов();
			
		КонецЕсли;
			
	КонецЕсли;
	
	Возврат Используется;
	
КонецФункции

// Определяет наличие менеджера регистрации у плана обмена.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе.
//
//  Возвращаемое значение:
//    Булево - Истина - у плана обмена есть модуль регистрации, иначе Ложь.
//                                                            
Функция ПравилаРегистрацииВМенеджере(Знач ИмяПланаОбмена) Экспорт
	
	НастройкиПланаОбмена = ОбменДаннымиСервер.НастройкиПланаОбмена(ИмяПланаОбмена, "", "", Неопределено);
		
	Возврат НастройкиПланаОбмена.ПравилаРегистрацииВМенеджере;	
	
КонецФункции

// Возвращает имя менеджера регистрации (имя общего модуля) для плана обмена
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе.
//
//  Возвращаемое значение:
//    Булево - Истина - у плана обмена есть модуль регистрации, иначе Ложь.
// 
Функция ИмяМенеджераРегистрации(Знач ИмяПланаОбмена) Экспорт
	
	НастройкиПланаОбмена = ОбменДаннымиСервер.НастройкиПланаОбмена(ИмяПланаОбмена, "", "", Неопределено);
	
	Возврат НастройкиПланаОбмена.ИмяМенеджераРегистрации;	
	
КонецФункции	

// Возвращает признак использования кеша при поиске ссылок в регистре сведений ПубличныеИдентификаторыСинхронизируемыхОбъектов
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе.
//
//  Возвращаемое значение:
//    Булево - Истина - используется кеш, иначе Ложь - используются запросы к РС ПубличныеИдентификаторыСинхронизируемыхОбъектов.
// 
Функция ИспользоватьКешПубличныхИдентификаторов(Знач ИмяПланаОбмена) Экспорт
	
	НастройкиПланаОбмена = ОбменДаннымиСервер.НастройкиПланаОбмена(ИмяПланаОбмена, "", "", Неопределено);
	
	Возврат НастройкиПланаОбмена.ИспользоватьКешПубличныхИдентификаторов;
	
КонецФункции

// Возвращает признак Глобальный для плана обмена через EnterpriseData 
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе.
//
//  Возвращаемое значение:
//    Булево
// 
Функция ЭтоГлобальныйОбменЧерезУниверсальныйФормат(Знач ИмяПланаОбмена) Экспорт
	
	НастройкиПланаОбмена = ОбменДаннымиСервер.НастройкиПланаОбмена(ИмяПланаОбмена, "", "", Неопределено);
	
	Возврат НастройкиПланаОбмена.Глобальный;
	
КонецФункции



#КонецОбласти

#Область СлужебныеПроцедурыИФункции

////////////////////////////////////////////////////////////////////////////////
// Механизм регистрации объектов на узлах планов обмена (МРО).

// Получает таблицу правил регистрации объектов для плана обмена.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе,
//                    для которого необходимо получить правила регистрации.
//
// Возвращаемое значение:
//   ТаблицаЗначений - таблица правил регистрации для текущего плана обмена.
//
Функция ПравилаРегистрацииОбъектовПланаОбмена(Знач ИмяПланаОбмена) Экспорт
	
	ПравилаРегистрацииОбъектов = ОбменДаннымиСлужебный.ПараметрыСеансаПравилаРегистрацииОбъектов().Получить();
	
	Возврат ПравилаРегистрацииОбъектов.Скопировать(Новый Структура("ИмяПланаОбмена", ИмяПланаОбмена));
КонецФункции

// Получает таблицу правил регистрации объекта для заданного плана обмена.
//
// Параметры:
//  ИмяПланаОбмена   - Строка - имя плана обмена как оно задано в конфигураторе.
//  ПолноеИмяОбъекта - Строка - полное имя объекта метаданных,
//                   для которого необходимо получить правила регистрации.
//
// Возвращаемое значение:
//   ТаблицаЗначений - таблица правил регистрации объекта по заданному плану обмена.
//
Функция ПравилаРегистрацииОбъекта(Знач ИмяПланаОбмена, Знач ПолноеИмяОбъекта) Экспорт
	
	ПравилаРегистрацииОбъектовПланаОбмена = ОбменДаннымиСобытия.ПравилаРегистрацииОбъектовПланаОбмена(ИмяПланаОбмена);
	
	Возврат ПравилаРегистрацииОбъектовПланаОбмена.Скопировать(Новый Структура("ОбъектМетаданныхИмя", ПолноеИмяОбъекта));
	
КонецФункции

// Возвращает признак того, что существуют правила регистрации для объекта по заданному плану обмена.
//
// Параметры:
//  ИмяПланаОбмена   - Строка - имя плана обмена как оно задано в конфигураторе.
//  ПолноеИмяОбъекта - Строка - полное имя объекта метаданных,
//                   для которого необходимо определить признак наличия правил регистрации.
//
//  Возвращаемое значение:
//     Булево - Истина - правила регистрации для объекта существуют; Ложь - нет.
//
Функция ПравилаРегистрацииОбъектаСуществуют(Знач ИмяПланаОбмена, Знач ПолноеИмяОбъекта) Экспорт
	
	Возврат ОбменДаннымиСобытия.ПравилаРегистрацииОбъекта(ИмяПланаОбмена, ПолноеИмяОбъекта).Количество() <> 0;
	
КонецФункции

// Определяет признак авторегистрации объекта метаданных в составе плана обмена.
//
// Параметры:
//  ИмяПланаОбмена   - Строка - имя плана обмена, как оно задано в конфигураторе, в состав которого входит объект
//                              метаданных.
//  ПолноеИмяОбъекта - Строка - полное имя объекта метаданных, для которого требуется получить признак авторегистрации.
//
//  Возвращаемое значение:
//    Булево - Истина - объект метаданных имеет признак авторегистрации "Разрешена" в составе плана обмена;
//   Ложь - объект метаданных имеет признак авторегистрации "Запрещена" в составе плана обмена
//          или объект метаданных не входит в состав плана обмена.
//
Функция АвтоРегистрацияРазрешена(Знач ИмяПланаОбмена, Знач ПолноеИмяОбъекта) Экспорт
	
	ЭлементСоставаПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав.Найти(Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта));
	
	Если ЭлементСоставаПланаОбмена = Неопределено Тогда
		Возврат Ложь; // Объект метаданных не входит в состав плана обмена.
	КонецЕсли;
	
	Возврат ЭлементСоставаПланаОбмена.АвтоРегистрация = АвтоРегистрацияИзменений.Разрешить;
КонецФункции

// Определяет признак вхождения объекта метаданных в состав плана обмена.
//
// Параметры:
//  ИмяПланаОбмена   - Строка - имя плана обмена, как оно задано в конфигураторе.
//  ПолноеИмяОбъекта - Строка - полное имя объекта метаданных, для которого требуется получить признак.
//
//  Возвращаемое значение:
//    Булево - Истина - объект входит в состав плана обмена; Ложь - не входит.
//
Функция ПланОбменаСодержитОбъект(Знач ИмяПланаОбмена, Знач ПолноеИмяОбъекта) Экспорт
	
	ЭлементСоставаПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав.Найти(Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта));
	
	Возврат ЭлементСоставаПланаОбмена <> Неопределено;
КонецФункции

// Возвращает список планов обмена, которые содержат хотя бы один узел обмена (не учитывая ЭтотУзел).
//
Функция ИспользуемыеПланыОбмена() Экспорт
	
	Возврат ОбменДаннымиСервер.ПолучитьИспользуемыеПланыОбмена();
	
КонецФункции

// Возвращает состав плана обмена, заданный пользователем.
// Пользовательский состав плана обмена определяется правилами регистрации объектов
// и настройками узла, которые задал пользователь.
//
// Параметры:
//  Получатель - ПланОбменаСсылка - ссылка на узел плана обмена,
//               для которого требуется получить пользовательский состав плана обмена.
//
//  Возвращаемое значение:
//   Соответствие из КлючИЗначение:
//     * Ключ     - Строка - полное имя объекта метаданных входящего в состав плана обмена;
//     * Значение - ПеречислениеСсылка.РежимыВыгрузкиОбъектовОбмена - режим выгрузки объекта.
//
Функция ПользовательскийСоставПланаОбмена(Знач Получатель) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Результат = Новый Соответствие;
	
	СвойстваПолучателя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Получатель,
		ОбщегоНазначения.ИменаРеквизитовПоТипу(Получатель, Тип("ПеречислениеСсылка.РежимыВыгрузкиОбъектовОбмена")));
	
	Приоритеты = ПриоритетыРежимовВыгрузкиОбъектов();
	ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Получатель);
	Правила = ОбменДаннымиПовтИсп.ПравилаРегистрацииОбъектовПланаОбмена(ИмяПланаОбмена);
	Правила.Индексы.Добавить("ОбъектМетаданныхИмя");
	
	Для Каждого Элемент Из Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав Цикл
		
		ИмяОбъекта = Элемент.Метаданные.ПолноеИмя();
		ПравилаОбъекта = Правила.НайтиСтроки(Новый Структура("ОбъектМетаданныхИмя", ИмяОбъекта));
		РежимВыгрузки = Неопределено;
		
		Если ПравилаОбъекта.Количество() = 0 Тогда // Правила регистрации не заданы.
			
			РежимВыгрузки = Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьВсегда;
			
		Иначе // заданы правила регистрации
			
			Для Каждого ПРО Из ПравилаОбъекта Цикл
				
				Если ЗначениеЗаполнено(ПРО.ИмяРеквизитаФлага) Тогда
					РежимВыгрузки = МаксимальныйРежимВыгрузкиОбъекта(СвойстваПолучателя[ПРО.ИмяРеквизитаФлага], РежимВыгрузки, Приоритеты);
				КонецЕсли;
				
			КонецЦикла;
			
			Если РежимВыгрузки = Неопределено
				ИЛИ РежимВыгрузки = Перечисления.РежимыВыгрузкиОбъектовОбмена.ПустаяСсылка() Тогда
				РежимВыгрузки = Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПоУсловию;
			КонецЕсли;
			
		КонецЕсли;
		
		Результат.Вставить(ИмяОбъекта, РежимВыгрузки);
		
	КонецЦикла;
	
	УстановитьПривилегированныйРежим(Ложь);
	
	Возврат Результат;
КонецФункции

// Возвращает режим выгрузки объекта на основании пользовательского состава плана обмена (настроек пользователя).
//
// Параметры:
//  ИмяОбъекта - полное имя объекта метаданных, для которого требуется получить режим выгрузки;
//  Получатель - ПланОбменаСсылка - ссылка на узел плана обмена, пользовательский состав которого будет использоваться.
//
// Возвращаемое значение:
//   ПеречислениеСсылка.РежимыВыгрузкиОбъектовОбмена - режим выгрузки объекта.
//
Функция РежимВыгрузкиОбъекта(Знач ИмяОбъекта, Знач Получатель) Экспорт
	
	Результат = ОбменДаннымиПовтИсп.ПользовательскийСоставПланаОбмена(Получатель).Получить(ИмяОбъекта);
	
	Возврат ?(Результат = Неопределено, Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьВсегда, Результат);
КонецФункции

Функция МаксимальныйРежимВыгрузкиОбъекта(Знач РежимВыгрузки1, Знач РежимВыгрузки2, Знач Приоритеты)
	
	Если Приоритеты.Найти(РежимВыгрузки1) < Приоритеты.Найти(РежимВыгрузки2) Тогда
		
		Возврат РежимВыгрузки1;
		
	Иначе
		
		Возврат РежимВыгрузки2;
		
	КонецЕсли;
	
КонецФункции

Функция ПриоритетыРежимовВыгрузкиОбъектов()
	
	Результат = Новый Массив;
	Результат.Добавить(Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьВсегда);
	Результат.Добавить(Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьВручную);
	Результат.Добавить(Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПоУсловию);
	Результат.Добавить(Перечисления.РежимыВыгрузкиОбъектовОбмена.ПустаяСсылка());
	Результат.Добавить(Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПриНеобходимости);
	Результат.Добавить(Перечисления.РежимыВыгрузкиОбъектовОбмена.НеВыгружать);
	Результат.Добавить(Неопределено);
	
	Возврат Результат;
КонецФункции

// Получает предопределенный узел плана обмена.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе.
// 
// Возвращаемое значение:
//  ЭтотУзел - ПланОбменаСсылка - предопределенный узел плана обмена.
//
Функция ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена) Экспорт
	
	Возврат ПланыОбмена[ИмяПланаОбмена].ЭтотУзел();
	
КонецФункции

// Возвращает признак принадлежности узла к плану обмена РИБ.
//
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого требуется получить значение функции.
//
//  Возвращаемое значение:
//    Булево - Истина - узел принадлежит плану обмена РИБ, иначе Ложь.
//
Функция ЭтоУзелРаспределеннойИнформационнойБазы(Знач УзелИнформационнойБазы) Экспорт

	Возврат УзелИнформационнойБазы.Метаданные().РаспределеннаяИнформационнаяБаза;
	
КонецФункции

// Возвращает признак принадлежности узла к плану обмена стандартного обмена (без правил конвертации).
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, для которого требуется получить значение функции.
//
//  Возвращаемое значение:
//    Булево - Истина - узел принадлежит плану обмена стандартного обмена, иначе Ложь.
//
Функция ЭтоУзелСтандартногоОбменаДанными(ИмяПланаОбмена) Экспорт
	
	Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(ИмяПланаОбмена) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Не ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена)
		И Не ОбменДаннымиПовтИсп.ЕстьМакетПланаОбмена(ИмяПланаОбмена, "ПравилаОбмена");
	
КонецФункции

// Возвращает признак принадлежности узла к плану обмена универсального обмена (по правилам конвертации).
//
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого требуется получить значение функции.
//
//  Возвращаемое значение:
//    Булево - Истина - узел принадлежит плану обмена универсального обмена, иначе Ложь.
//
Функция ЭтоУзелУниверсальногоОбменаДанными(УзелИнформационнойБазы) Экспорт
	
	Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
		Возврат Истина;
	Иначе
		Возврат Не ЭтоУзелРаспределеннойИнформационнойБазы(УзелИнформационнойБазы)
			И ЕстьМакетПланаОбмена(ПолучитьИмяПланаОбмена(УзелИнформационнойБазы), "ПравилаОбмена");
	КонецЕсли;
	
КонецФункции

// Возвращает признак принадлежности узла к плану обмена, который использует функционал обмена БСП.
//
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка
//                         - ПланОбменаОбъект - узел плана обмена, для которого требуется получить
//                           значение функции.
//
//  Возвращаемое значение:
//    Булево - Истина - узел принадлежит плану обмена, использующего функционал БСП, иначе Ложь.
//
Функция ЭтоУзелОбменаДаннымиБСП(Знач УзелИнформационнойБазы) Экспорт
	
	Возврат ПланыОбменаБСП().Найти(ПолучитьИмяПланаОбмена(УзелИнформационнойБазы)) <> Неопределено;
	
КонецФункции

// Возвращает признак принадлежности узла к разделенному плану обмена, который использует функционал обмена БСП.
//
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого требуется получить значение функции.
//
//  Возвращаемое значение:
//    Булево - Истина - узел принадлежит разделенному плану обмена, использующего функционал БСП, иначе Ложь.
//
Функция ЭтоУзелРазделенногоОбменаДаннымиБСП(УзелИнформационнойБазы) Экспорт
	
	Возврат РазделенныеПланыОбменаБСП().Найти(ПолучитьИмяПланаОбмена(УзелИнформационнойБазы)) <> Неопределено;
	
КонецФункции

// Возвращает признак принадлежности узла к плану обмена, используемому для обмена сообщениями.
//
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого требуется получить значение функции.
//
//  Возвращаемое значение:
//    Булево - Истина - узел принадлежит плану обмена сообщениями, иначе Ложь.
//
Функция ЭтоУзелОбменаСообщениями(УзелИнформационнойБазы) Экспорт
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОбменСообщениями") Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Возврат ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы) = "ОбменСообщениями";
	
КонецФункции

// Получает список макетов типовых правил обмена из конфигурации для заданного плана обмена;
// список заполняется именами и синонимами макетов правил.
// 
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе.
// 
// Возвращаемое значение:
//  СписокПравил - СписокЗначений - список макетов типовых правил обмена.
//
Функция ПравилаКонвертацииДляПланаОбменаИзКонфигурации(ИмяПланаОбмена) Экспорт
	
	Возврат ПравилаДляПланаОбменаИзКонфигурации(ИмяПланаОбмена, "ПравилаОбмена");
	
КонецФункции

// Получает список макетов типовых правил регистрации из конфигурации для плана обмена;
// список заполняется именами и синонимами макетов правил.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе.
// 
// Возвращаемое значение:
//  СписокПравил - СписокЗначений - список макетов типовых правил регистрации.
//
Функция ПравилаРегистрацииДляПланаОбменаИзКонфигурации(ИмяПланаОбмена) Экспорт
	
	Возврат ПравилаДляПланаОбменаИзКонфигурации(ИмяПланаОбмена, "ПравилаРегистрации");
	
КонецФункции

// Получает список планов обмена конфигурации, которые используют функционал БСП.
// Список заполняется именами и синонимами планов обмена.
//
// Параметры:
//  Нет.
// 
// Возвращаемое значение:
//  СписокПлановОбмена - СписокЗначений - список планов обмена конфигурации.
//
Функция СписокПлановОбменаБСП() Экспорт
	
	// Возвращаемое значение функции.
	СписокПлановОбмена = Новый СписокЗначений;
	
	ПланыОбменаПодсистемы = Новый Массив;
	
	ОбменДаннымиПереопределяемый.ПолучитьПланыОбмена(ПланыОбменаПодсистемы);
	
	Для Каждого ПланОбмена Из ПланыОбменаПодсистемы Цикл
		
		СписокПлановОбмена.Добавить(ПланОбмена.Имя, ПланОбмена.Синоним);
		
	КонецЦикла;
	
	Возврат СписокПлановОбмена;
	
КонецФункции

// Для внутреннего использования.
//
Функция ОбщиеДанныеУзлов(Знач УзелИнформационнойБазы) Экспорт
	
	Возврат ОбменДаннымиСервер.ОбщиеДанныеУзлов(ПолучитьИмяПланаОбмена(УзелИнформационнойБазы),
		РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.ВерсияКорреспондента(УзелИнформационнойБазы),
		"");
КонецФункции

// Для внутреннего использования.
//
Функция ТабличныеЧастиПланаОбмена(Знач ИмяПланаОбмена, Знач ВерсияКорреспондента = "", Знач ИдентификаторНастройки = "") Экспорт
	
	ТаблицыОбщие             = Новый Массив;
	ТаблицыЭтойБазы          = Новый Массив;
	ВсеТаблицыЭтойБазы       = Новый Массив;
	
	ОбщиеДанныеУзлов = ОбменДаннымиСервер.ОбщиеДанныеУзлов(ИмяПланаОбмена, ВерсияКорреспондента, ИдентификаторНастройки);
	
	ТабличныеЧасти = ОбменДаннымиСобытия.ТабличныеЧастиОбъекта(Метаданные.ПланыОбмена[ИмяПланаОбмена]);
	
	Если Не ПустаяСтрока(ОбщиеДанныеУзлов) Тогда
		
		Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
			
			Если СтрНайти(ОбщиеДанныеУзлов, ТабличнаяЧасть) <> 0 Тогда
				
				ТаблицыОбщие.Добавить(ТабличнаяЧасть);
				
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
	НастройкиЭтойБазы = ОбменДаннымиСервер.НастройкаОтборовНаУзле(ИмяПланаОбмена, ВерсияКорреспондента, ИдентификаторНастройки);
	
	НастройкиЭтойБазы = ОбменДаннымиСобытия.КлючиСтруктурыВСтроку(НастройкиЭтойБазы);
	
	Если ПустаяСтрока(ОбщиеДанныеУзлов) Тогда
		
		Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
			
			ВсеТаблицыЭтойБазы.Добавить(ТабличнаяЧасть);
			
			Если СтрНайти(НастройкиЭтойБазы, ТабличнаяЧасть) <> 0 Тогда
				
				ТаблицыЭтойБазы.Добавить(ТабличнаяЧасть);
				
			КонецЕсли;
			
		КонецЦикла;
		
	Иначе
		
		Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
			
			ВсеТаблицыЭтойБазы.Добавить(ТабличнаяЧасть);
			
			Если СтрНайти(НастройкиЭтойБазы, ТабличнаяЧасть) <> 0 Тогда
				
				Если СтрНайти(ОбщиеДанныеУзлов, ТабличнаяЧасть) = 0 Тогда
					
					ТаблицыЭтойБазы.Добавить(ТабличнаяЧасть);
					
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("ТаблицыОбщие",             ТаблицыОбщие);
	Результат.Вставить("ТаблицыЭтойБазы",          ТаблицыЭтойБазы);
	Результат.Вставить("ВсеТаблицыЭтойБазы",       ВсеТаблицыЭтойБазы);
	
	Возврат Результат;
	
КонецФункции

// Получает менеджер плана обмена по имени плана обмена.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе.
//
// Возвращаемое значение:
//  ПланОбменаМенеджер - менеджер плана обмена.
//
Функция ПолучитьМенеджерПланаОбменаПоИмени(ИмяПланаОбмена) Экспорт
	
	Возврат ПланыОбмена[ИмяПланаОбмена];
	
КонецФункции

// Функция-обертка одноименной функции.
//
Функция МетаданныеКонфигурации(Отбор) Экспорт
	
	Для Каждого ЭлементОтбора Из Отбор Цикл
		
		Отбор[ЭлементОтбора.Ключ] = СтрРазделить(ЭлементОтбора.Значение, ",");
		
	КонецЦикла;
	
	Возврат ОбменДаннымиСервер.ДеревоМетаданныхКонфигурации(Отбор);
	
КонецФункции

// Для внутреннего использования.
//
Функция СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена) Экспорт
	
	СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы(
		УзелИнформационнойБазы,
		Перечисления.ДействияПриОбмене.ЗагрузкаДанных,
		Неопределено,
		Ложь);
		
	СтруктураНастроекОбмена.ОбработкаОбменаДанными.ИмяФайлаОбмена = ИмяФайлаСообщенияОбмена;
	
	Возврат СтруктураНастроекОбмена;
	
КонецФункции

// Функция-обертка одноименной функции модуля ОбменДаннымиСобытия.
//
Функция МассивУзловПоЗначениямСвойств(ЗначенияСвойств, ТекстЗапроса, ИмяПланаОбмена, ИмяРеквизитаФлага, Знач Выгрузка = Ложь) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Возврат ОбменДаннымиСобытия.МассивУзловПоЗначениямСвойств(ЗначенияСвойств, ТекстЗапроса, ИмяПланаОбмена, ИмяРеквизитаФлага, Выгрузка);
	
КонецФункции

// Возвращает коллекцию транспортов сообщений обмена, которые могут быть использованы для заданного узла плана обмена.
//
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого требуется получить значение функции.
//  ВариантНастройки       - Строка           - идентификатор варианта настройки синхронизации данных.
// 
//  Возвращаемое значение:
//   Массив - используемые транспорты сообщений обмена для узла.
//
Функция ИспользуемыеТранспортыСообщенийОбмена(УзелИнформационнойБазы, Знач ВариантНастройки = "") Экспорт
	
	ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы);
	
	Если Не УзелИнформационнойБазы.Пустая() Тогда
		ВариантНастройки = ОбменДаннымиСервер.СохраненныйВариантНастройкиУзлаПланаОбмена(УзелИнформационнойБазы);
	КонецЕсли;
	
	ОписаниеВариантаНастройки = ОбменДаннымиПовтИсп.ОписаниеВариантаНастройки(ИмяПланаОбмена,  
		ВариантНастройки, "", "");
	
	Результат = ОписаниеВариантаНастройки.ИспользуемыеТранспортыСообщенийОбмена;
	
	Если Результат.Количество() = 0 Тогда
		Результат = ОбменДаннымиСервер.ВсеТранспортыСообщенийОбменаКонфигурации();
	КонецЕсли;
	
	// Обмен через COM-соединение не поддерживается:
	//  - для базовых версий конфигураций;
	//  - для РИБ;
	//  - для стандартного обмена (без использования правил конвертации);
	//  - если сервер 1С запущен на ОС Linux.
	//
	Если СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации()
		Или ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена)
		Или ОбменДаннымиПовтИсп.ЭтоУзелСтандартногоОбменаДанными(ИмяПланаОбмена)
		Или ОбщегоНазначения.ЭтоLinuxСервер() Тогда
		
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(Результат,
			Перечисления.ВидыТранспортаСообщенийОбмена.COM);
			
	КонецЕсли;
	
	// Обмен через WS-соединение не поддерживается:
	//  - для РИБ, не являющихся АРМ.
	//
	Если ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(ИмяПланаОбмена)
		И Не ОбменДаннымиПовтИсп.ЭтоУзелАвтономногоРабочегоМеста(УзелИнформационнойБазы) Тогда
		
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(Результат,
			Перечисления.ВидыТранспортаСообщенийОбмена.WS);
		
	КонецЕсли;
	
	// Обмен через WS-соединение в пассивном режиме не поддерживается:
	//  - для обменов, не являющихся обменом через XDTO;
	//  - для файловых информационных баз.
	//
	Если Не ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(ИмяПланаОбмена)
		Или ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
		
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(Результат,
			Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим);
		
	КонецЕсли;
	
	// Обмен через электронную почту не поддерживается:
	//  - когда недоступна подсистема работы с почтовыми сообщениями;
	//  - когда в конфигурации недоступно получение писем.
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда
		МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный");
		Если Не МодульРаботаСПочтовымиСообщениямиСлужебный.ДоступноПолучениеПисем() Тогда
			ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(Результат,
				Перечисления.ВидыТранспортаСообщенийОбмена.EMAIL);
		КонецЕсли;
	Иначе
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(Результат,
			Перечисления.ВидыТранспортаСообщенийОбмена.EMAIL);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Устанавливает внешнее соединение с информационной базой и возвращает указатель на это соединение.
// 
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить
//  внешнее соединение.
//  СтрокаСообщенияОбОшибке - Строка - если в процессе установки внешнего соединения возникает ошибка,
//   то подробное описание ошибки помещается в этот параметр.
//
// Возвращаемое значение:
//  COM-объект - в случае успешной установки внешнего соединения, в случае ошибки возвращается Неопределено.
//
Функция ПолучитьВнешнееСоединениеДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СтрокаСообщенияОбОшибке = "") Экспорт

	Результат = ВнешнееСоединениеДляУзлаИнформационнойБазы(УзелИнформационнойБазы);

	СтрокаСообщенияОбОшибке = Результат.ПодробноеОписаниеОшибки;
	Возврат Результат.Соединение;
	
КонецФункции

// Устанавливает внешнее соединение с информационной базой и возвращает указатель на это соединение.
// 
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить
//  внешнее соединение.
//  СтрокаСообщенияОбОшибке (необязательный) - Строка - если в процессе установки внешнего соединения возникает ошибка,
//   то подробное описание ошибки помещается в этот параметр.
//
// Возвращаемое значение:
//  COM-объект - в случае успешной установки внешнего соединения, в случае ошибки возвращается Неопределено.
//
Функция ВнешнееСоединениеДляУзлаИнформационнойБазы(УзелИнформационнойБазы) Экспорт
	
	Возврат ОбменДаннымиСервер.УстановитьВнешнееСоединениеСБазой(
        РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспорта(
            УзелИнформационнойБазы, Перечисления.ВидыТранспортаСообщенийОбмена.COM));
	
КонецФункции

// Возвращает признак доступности использования плана обмена.
// Признак вычисляется по составу всех функциональных опций конфигурации.
// Если план обмена не входит в состав ни одной функциональной опции, то возвращается Истина.
// Если план обмена входит в состав функциональных опций, то возвращается Истина,если хотя бы одна функциональная опция
// включена.
// В противном случае функция возвращает Ложь.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, для которого необходимо вычислить признак использования.
//
// Возвращаемое значение:
//   Булево - Истина - доступно использование плана обмена.
//  Ложь - использование не доступно.
//
Функция ДоступноИспользованиеПланаОбмена(Знач ИмяПланаОбмена) Экспорт
	
	ОбъектВходитВСоставФункциональныхОпций = Ложь;
	
	Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл
		
		Если ФункциональнаяОпция.Состав.Содержит(Метаданные.ПланыОбмена[ИмяПланаОбмена]) Тогда
			
			ОбъектВходитВСоставФункциональныхОпций = Истина;
			
			Если ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя) = Истина Тогда
				
				Возврат Истина;
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Если Не ОбъектВходитВСоставФункциональныхОпций Тогда
		
		Возврат Истина;
		
	КонецЕсли;
	
	Возврат Ложь;
КонецФункции

// Возвращает массив номеров версий, поддерживаемых интерфейсом корреспондента для подсистемы ОбменДанными.
// 
// Параметры:
//   Корреспондент - Структура
//                 - ПланОбменаСсылка - узел плана обмена, который соответствует информационной
//                 базе-корреспонденту.
//
// Возвращаемое значение:
//   Массив номеров версий, поддерживаемых интерфейсом корреспондента.
//
Функция ВерсииКорреспондента(Знач Корреспондент) Экспорт
	
	Если ТипЗнч(Корреспондент) = Тип("Структура") Тогда
		СтруктураНастроек = Корреспондент;
	Иначе
		Если ОбменДаннымиПовтИсп.ЭтоУзелОбменаСообщениями(Корреспондент) Тогда
			МодульНастройкиТранспортаОбменаСообщениями = ОбщегоНазначения.ОбщийМодуль("РегистрыСведений.НастройкиТранспортаОбменаСообщениями");
			СтруктураНастроек = МодульНастройкиТранспортаОбменаСообщениями.НастройкиТранспортаWS(Корреспондент);
		Иначе
			СтруктураНастроек = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS(Корреспондент);
		КонецЕсли;
	КонецЕсли;
	
	ПараметрыПодключения = Новый Структура;
	ПараметрыПодключения.Вставить("URL",      СтруктураНастроек.WSURLВебСервиса);
	ПараметрыПодключения.Вставить("UserName", СтруктураНастроек.WSИмяПользователя);
	ПараметрыПодключения.Вставить("Password", СтруктураНастроек.WSПароль);
	
	Возврат ОбщегоНазначения.ПолучитьВерсииИнтерфейса(ПараметрыПодключения, "ОбменДанными");
	
КонецФункции

// Возвращает массив всех ссылочных типов, определенных в конфигурации.
//
Функция ВсеСсылочныеТипыКонфигурации() Экспорт
	
	Результат = Новый Массив;
	
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, Справочники.ТипВсеСсылки().Типы());
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, Документы.ТипВсеСсылки().Типы());
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, БизнесПроцессы.ТипВсеСсылки().Типы());
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, ПланыВидовХарактеристик.ТипВсеСсылки().Типы());
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, ПланыСчетов.ТипВсеСсылки().Типы());
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, ПланыВидовРасчета.ТипВсеСсылки().Типы());
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, Задачи.ТипВсеСсылки().Типы());
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, ПланыОбмена.ТипВсеСсылки().Типы());
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, Перечисления.ТипВсеСсылки().Типы());
	
	Возврат Результат;
КонецФункции

Функция ПланыОбменаАвтономнойРаботы()
	
	// План обмена для организации автономной работы в модели сервиса должен:
	// - быть разделенным
	// - быть планом обмена распределенной ИБ
	// - использоваться для обмена в модели сервиса (ПланОбменаИспользуетсяВМоделиСервиса = Истина).
	
	Результат = Новый Массив;
	
	Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл
		
		Если ОбменДаннымиСервер.ЭтоРазделенныйПланОбменаБСП(ПланОбмена.Имя)
			И ПланОбмена.РаспределеннаяИнформационнаяБаза
			И ОбменДаннымиПовтИсп.ПланОбменаИспользуетсяВМоделиСервиса(ПланОбмена.Имя) Тогда
			
			Результат.Добавить(ПланОбмена.Имя);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

Функция ИмяПрофиляБезопасности(Знач ИмяПланаОбмена) Экспорт
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Если Справочники.ИдентификаторыОбъектовМетаданных.ДанныеОбновлены() Тогда
		ИдентификаторПланаОбмена = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.ПланыОбмена[ИмяПланаОбмена]);
		МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный");
		ИмяПрофиляБезопасности = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(ИдентификаторПланаОбмена);
	Иначе
		ИмяПрофиляБезопасности = Неопределено;
	КонецЕсли;
	
	Если ИмяПрофиляБезопасности = Неопределено Тогда
		МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
		ИмяПрофиляБезопасности = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();
		Если ПустаяСтрока(ИмяПрофиляБезопасности) Тогда
			ИмяПрофиляБезопасности = Неопределено;
		КонецЕсли;
	КонецЕсли;
	
	Возврат ИмяПрофиляБезопасности;
	
КонецФункции

Функция РегистрацияПриЗацикливании(УзелИнформационнойБазы) Экспорт
	
	Возврат РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.РегистрацияПриЗацикливании(УзелИнформационнойБазы);
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Инициализация структуры настроек обмена данными.

// Получает структуру настроек транспорта для выполнения обмена данными.
//
Функция НастройкиТранспортаУзлаПланаОбмена(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена) Экспорт
	
	Возврат ОбменДаннымиСервер.НастройкиТранспортаОбмена(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена);
	
КонецФункции

// Получает список макетов типовых правил для обмена данными из конфигурации для заданного плана обмена;
// список заполняется именами и синонимами макетов правил.
// 
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе.
// 
// Возвращаемое значение:
//  СписокПравил - СписокЗначений - список макетов типовых правил для обмена данными.
//
Функция ПравилаДляПланаОбменаИзКонфигурации(ИмяПланаОбмена, ЛитералИмениМакета)
	
	СписокПравил = Новый СписокЗначений;
	
	Если ПустаяСтрока(ИмяПланаОбмена) Тогда
		Возврат СписокПравил;
	КонецЕсли;
	
	Для Каждого Макет Из Метаданные.ПланыОбмена[ИмяПланаОбмена].Макеты Цикл
		
		Если СтрНайти(Макет.Имя, ЛитералИмениМакета) <> 0 И СтрНайти(Макет.Имя, "Корреспондента") = 0 Тогда
			
			СписокПравил.Добавить(Макет.Имя, Макет.Синоним);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат СписокПравил;
КонецФункции

// Возвращает таблицу состава узла (только ссылочные типы).
//
// Параметры:
//    ИмяПланаОбмена - Строка - анализируемый план обмена.
//    Периодические  - флаг того, что надо включать в результат объекты с датой (документы и т.п.).
//    Справочные     - флаг того, что надо включать в результат нормативно-справочные объекты.
//
// Возвращаемое значение:
//    ТаблицаЗначений:
//      * ПолноеИмяМетаданных - Строка - полное имя метаданных (имя таблицы для запроса).
//      * ПредставлениеСписка - Строка - представление списка для таблицы.
//      * Представление       - Строка - представление объекта для таблицы.
//      * ИндексКартинки      - Число - индекс картинки согласно "БиблиотекаКартинок.КоллекцияОбъектыМетаданных".
//      * Тип                 - Тип - соответствующий тип.
//      * ВыборПериода        - Булево - флаг того, что к объекту можно применить выбор по периода.
//
Функция СоставПланаОбмена(ИмяПланаОбмена, Периодические = Истина, Справочные = Истина) Экспорт
	
	ТаблицаРезультата = Новый ТаблицаЗначений;
	Для Каждого КлючЗначение Из (Новый Структура("ПолноеИмяМетаданных, Представление, ПредставлениеСписка, ИндексКартинки, Тип, ВыборПериода")) Цикл
		ТаблицаРезультата.Колонки.Добавить(КлючЗначение.Ключ);
	КонецЦикла;
	Для Каждого КлючЗначение Из (Новый Структура("ПолноеИмяМетаданных, Представление, ПредставлениеСписка, Тип")) Цикл
		ТаблицаРезультата.Индексы.Добавить(КлючЗначение.Ключ);
	КонецЦикла;
	
	СоставПланаОбмена = Метаданные.ПланыОбмена.Найти(ИмяПланаОбмена).Состав;
	Для Каждого ЭлементСостава Из СоставПланаОбмена Цикл
		
		МетаданныеОбъекта = ЭлементСостава.Метаданные;
		Описание = ОписаниеОбъектаМетаданных(МетаданныеОбъекта);
		Если Описание.ИндексКартинки >= 0 Тогда
			Если Не Периодические И Описание.Периодический Тогда 
				Продолжить;
			ИначеЕсли Не Справочные И Описание.Справочный Тогда 
				Продолжить;
			КонецЕсли;
			
			Строка = ТаблицаРезультата.Добавить();
			ЗаполнитьЗначенияСвойств(Строка, Описание);
			Строка.ВыборПериода        = Описание.Периодический;
			Строка.ПолноеИмяМетаданных = МетаданныеОбъекта.ПолноеИмя();
			Строка.ПредставлениеСписка = ОбменДаннымиСервер.ПредставлениеСпискаОбъектов(МетаданныеОбъекта);
			Строка.Представление       = ОбменДаннымиСервер.ПредставлениеОбъекта(МетаданныеОбъекта);
		КонецЕсли;
	КонецЦикла;
	
	ТаблицаРезультата.Сортировать("ПредставлениеСписка");
	Возврат ТаблицаРезультата;
	
КонецФункции

// Возвращает описание объекта метаданных.
// 
// Параметры:
//   Мета - ОбъектМетаданных - объект метаданных.
//
// Возвращаемое значение:
//   Структура:
//     * ИндексКартинки - Число - индекс картинки.
//     * Периодический - Булево - Истина, если объект периодический.
//     * Справочный - Булево - Истина, если объект справочный.
//     * Тип - Тип - ссылочный тип значения.
//
Функция ОписаниеОбъектаМетаданных(Мета)
	
	Результат = Новый Структура("ИндексКартинки, Периодический, Справочный, Тип", -1, Ложь, Ложь);
	
	Если Метаданные.Справочники.Содержит(Мета) Тогда
		Результат.ИндексКартинки = 3;
		Результат.Справочный = Истина;
		Результат.Тип = Тип("СправочникСсылка." + Мета.Имя);
		
	ИначеЕсли Метаданные.Документы.Содержит(Мета) Тогда
		Результат.ИндексКартинки = 7;
		Результат.Периодический = Истина;
		Результат.Тип = Тип("ДокументСсылка." + Мета.Имя);
		
	ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(Мета) Тогда
		Результат.ИндексКартинки = 9;
		Результат.Справочный = Истина;
		Результат.Тип = Тип("ПланВидовХарактеристикСсылка." + Мета.Имя);
		
	ИначеЕсли Метаданные.ПланыСчетов.Содержит(Мета) Тогда
		Результат.ИндексКартинки = 11;
		Результат.Справочный = Истина;
		Результат.Тип = Тип("ПланСчетовСсылка." + Мета.Имя);
		
	ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(Мета) Тогда
		Результат.ИндексКартинки = 13;
		Результат.Справочный = Истина;
		Результат.Тип = Тип("ПланВидовРасчетаСсылка." + Мета.Имя);
		
	ИначеЕсли Метаданные.БизнесПроцессы.Содержит(Мета) Тогда
		Результат.ИндексКартинки = 23;
		Результат.Периодический = Истина;
		Результат.Тип = Тип("БизнесПроцессСсылка." + Мета.Имя);
		
	ИначеЕсли Метаданные.Задачи.Содержит(Мета) Тогда
		Результат.ИндексКартинки = 25;
		Результат.Периодический  = Истина;
		Результат.Тип = Тип("ЗадачаСсылка." + Мета.Имя);
		
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

// Функция возвращает имя каталога временных файлов.
//
// Возвращаемое значение:
//  Строка - путь к каталогу временных файлов.
//
Функция КаталогВременногоХранилищаФайлов(БезопасныйРежим = Неопределено) Экспорт
	
	Если ОбщегоНазначения.ИнформационнаяБазаФайловая() И НЕ ОбщегоНазначения.РежимОтладки() Тогда
		
		Возврат СокрЛП(КаталогВременныхФайлов());
		
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	
	ОбщийТипПлатформы = "";
	Если ОбщегоНазначения.ЭтоLinuxСервер() Тогда
	
		Результат         = Константы.КаталогСообщенийОбменаДаннымиДляLinux.Получить();
		ОбщийТипПлатформы = "Linux";
		
	Иначе
		
		Результат         = Константы.КаталогСообщенийОбменаДаннымиДляWindows.Получить();
		ОбщийТипПлатформы = "Windows";
		
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Ложь);
	
	Если ПустаяСтрока(Результат) Тогда
		
		Результат = СокрЛП(КаталогВременныхФайлов());
		
	Иначе
		
		Результат = СокрЛП(Результат);
		
		// Проверка существования каталога.
		Каталог = Новый Файл(Результат);
		Если Не Каталог.Существует() Тогда
			
			ПредставлениеКонстанты = ?(ОбщийТипПлатформы = "Linux", 
				Метаданные.Константы.КаталогСообщенийОбменаДаннымиДляLinux.Представление(),
				Метаданные.Константы.КаталогСообщенийОбменаДаннымиДляWindows.Представление());
			
			ШаблонСообщения = НСтр("ru = 'Каталог временных файлов не существует.
					|Необходимо убедиться, что в настройках программы задано правильное значение параметра
					|""%1"".'", ОбщегоНазначения.КодОсновногоЯзыка());
			
			ТекстСообщения = СтрШаблон(ШаблонСообщения, ПредставлениеКонстанты);
			ВызватьИсключение(ТекстСообщения);
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Инициализирует колонки таблицы правил регистрации по свойствам.
//
//  Возвращаемое значение:
//    ДеревоЗначений
//
Функция ИнициализацияТаблицыОтборПоСвойствамПланаОбмена() Экспорт

	Обработка = Обработки.ЗагрузкаПравилРегистрацииОбъектов;
	Возврат Обработка.ИнициализацияТаблицыОтборПоСвойствамПланаОбмена();
	
КонецФункции

// Инициализирует колонки таблицы правил регистрации по свойствам.
//
//  Возвращаемое значение:
//    ДеревоЗначений
//
Функция ИнициализацияТаблицыОтборПоСвойствамОбъекта() Экспорт

	Обработка = Обработки.ЗагрузкаПравилРегистрацииОбъектов;
	Возврат Обработка.ИнициализацияТаблицыОтборПоСвойствамОбъекта();
	
КонецФункции

Функция ЭтоРегистр(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоРегистр(ОбъектМетаданных);
	
КонецФункции

Функция ЭтоДокумент(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоДокумент(ОбъектМетаданных);
	
КонецФункции

Функция ЭтоСправочник(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных);
	
КонецФункции

Функция ЭтоПеречисление(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоПеречисление(ОбъектМетаданных);
	
КонецФункции

Функция ЭтоПланВидовХарактеристик(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоПланВидовХарактеристик(ОбъектМетаданных);
	
КонецФункции

Функция ЭтоБизнесПроцесс(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоБизнесПроцесс(ОбъектМетаданных);
	
КонецФункции

Функция ЭтоЗадача(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоЗадача(ОбъектМетаданных);
	
КонецФункции

Функция ЭтоПланСчетов(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоПланСчетов(ОбъектМетаданных);
	
КонецФункции

Функция ЭтоПланВидовРасчета(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоПланВидовРасчета(ОбъектМетаданных);
	
КонецФункции

Функция ЭтоКонстанта(ПолноеИмяОбъекта) Экспорт
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъекта);
	Возврат ОбщегоНазначения.ЭтоКонстанта(ОбъектМетаданных);
	
КонецФункции

#КонецОбласти